package top.lishuoboy.javaweb.a13cookie_session;

import lombok.SneakyThrows;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * 3.3、表单重复提交之-----验证码
 * 表单重复提交有三种常见的情况:
 * 一:提交完表单。服务器使用请求转来进行页面跳转。这个时候，用户按下功能键F5，就会发起最后一次的请求。造成表单重复提交问题。解决方法:使用重定向来进行跳转
 * 二:用户正常提交服务器，但是由于网络延迟等原因，迟迟未收到服务器的响应，这个时候，用户以为提交失败，就会着急，然后多点了几次提交操作，也会造成表单重复提交。
 * 三:用户正常提交服务器。服务器也没有延迟，但是提交完成后，用户回退浏览器。重新提交。也会造成表单重复提交。
 *
 * @author lishuoboy
 * @date 2022-01-12 19:01
 */
@WebServlet(name = "LoginWithCaptchaServlet", value = "/LoginWithCaptchaServlet")
public class RegistWithCaptchaServlet extends BaseServlet {

    @SneakyThrows
    protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session 中的验证码
        String token = (String) req.getSession().getAttribute("KAPTCHA_SESSION_KEY");
        //删除Session 中的验证码
        req.getSession().removeAttribute("KAPTCHA_SESSION_KEY");

        TimeUnit.SECONDS.sleep(5);  // 模拟网络卡 5秒

        String code = req.getParameter("code");
        //获取用户名
        String name = req.getParameter("name");
        if (token != null && token.equalsIgnoreCase(code)) {  // 防止重复提交
            System.out.println("保存到数据库:" + name);
            // 注册成功，跳转登录页面。
            resp.getWriter().write("<h1>注册成功</h1>");
        } else {
            System.out.println("验证码错误");
            resp.sendRedirect(req.getContextPath() + "/13cookie_session/regist_with_captcha.jsp");
        }
    }
}
